#ifndef __ES_BOARD_H_
#define __ES_BOARD_H_

#include "stm_std_lib.h"
#include "config.h"

#include "es_usart.h"
#include "es_spi.h"
#include "es_iic.h"
#include "es_gpio.h"
#include "es_blinkLed.h"
#include "es_nrf24.h"
#include "es_encode.h"
#include "es_pwm30.h"
#include "esapi.h"

//nnp5
#ifdef USING_NNP5
#include "TransportLayer.h"
#endif



//需要在main.cpp定义的函数
extern void usart1Handler(u16 val);		//串口1接收中断处理
extern void usart2Handler(u16 val);		//串口2接收中断处理
extern void spi1Handle(u8 val);				//spi1中断处理



void SPIPackageReady(u8* buff, u8 length);
void UARTPackageReady(u8* buff, u8 length);




/**************************************


stm32主板类


主要配置应在Init()修改.以下为默认配置：

	USART：USART1、USART2开启,115200bps,8N1

	SPI: SPI1主机模式,115200bps,CPLO=0,CPHA=0,MSB,CSN=PA4

	IIC: IIC1开启,地址0x0


其它配置可添加在类定义末尾的 RCC_Config GPIO_Config NVIC_Config 中


使用方法:
	本头文件末尾已创建主板类实例，可以main函数中直接使用:
		Board.Init();
		Board.Run();

**************************************/
class CBoard {

public:

	//外设指针
	CUsart* pUsart1;
	CUsart* pUsart2;
	CSPI* pSpi;
	CI2C* pIIC;

#ifdef __USING_7BIT_SERIAL__	
	es_SerialPack serial;
#endif // __USING_7BIT_SERIAL__



//nrf2401
#ifdef __USING_NRF24__
	//CommandLayer radio;

	//void nrf24_tx(u8* addr, commPackage* p) {
	//	radio.commLayer.tx(addr, p);
	//}		
#endif // __USING_NRF24__



#ifdef __USING_PWM__
	es_Pwm30 pwm;
#endif // __USING_PWM__

	CBoard();
	~CBoard();

	void Init();
	void Loop();
	
	

//nnp5使用
#ifdef USING_NNP5
public:
//ack事件
virtual void ack_event();

//新数据包事件
virtual void new_pkg_event(unsigned char* buf,int len);

//nnp5数据发送事件处理
virtual void nnp5_SendDataNeed(unsigned char* buf, int len);

//向nnp5对象写入数据
void nnp5_inStream(uint8_t b);


//发送protobuf对象,fields:protobuf描述
void send_protobuf_pkg(void* protoObj, const pb_field_t fields[]);

//反序列化protobuf对象， protoObj:protobuf对象,  fields:protobuf描述
bool DeSerializ_protobuf_pkg(unsigned char* buf,int len,void* protoObj, const pb_field_t fields[]);
#endif


	
private:

	u8 isInitalized;


	//其它RCC配置
	virtual void RCC_Config() = 0;


	//其它GPIO配置
	virtual void GPIO_Config() = 0;


	//其它NVIC配置
	virtual void NVIC_Config() = 0;
};



#endif
